跳到主要内容

03 GPIO

up的视频讲解

从一个引脚的内部结构入手,看懂四种输入和四种输出方式,以及程序如何读写电平。

1 GPIO 如何连接芯片内外​

GPIO 是通用输入输出端口。输入时,芯片读取外部电路的状态;输出时,芯片控制外部电路的电平。一个引脚能做什么,取决于它内部启用了哪条通路。

先区分左侧的外部引脚与右侧的芯片内部通路。
先区分左侧的外部引脚与右侧的芯片内部通路。

PA0 表示 A 端口的第 0 个引脚。GPIO 配置涉及端口时钟、输入输出模式,以及数据寄存器。课程使用库函数完成配置,但理解内部结构后,函数的作用就不再抽象。

2 输入:把外部电压变成可读取的状态​

保护、上下拉与施密特触发器​

输入先经过引脚相关的保护电路。保护器件不能代替正确的电压匹配,外部信号仍应满足芯片引脚的电气要求。

上下拉电阻给未被外部电路驱动的输入提供默认状态。
上下拉电阻给未被外部电路驱动的输入提供默认状态。

如果一个数字输入既没有外部驱动,也没有上拉或下拉,它的电平可能不确定。上拉让默认状态趋向高电平,下拉让默认状态趋向低电平。

施密特触发器使用不同的上升、下降阈值,帮助形成稳定的数字状态。
施密特触发器使用不同的上升、下降阈值,帮助形成稳定的数字状态。

经过数字输入通路处理后,电平状态进入输入数据寄存器 IDR,CPU 便可以读取。模拟信号则需要保留电压的连续变化,不走相同的数字整形通路。

四种输入模式​

模式内部通路的区别在课程中的理解方式
浮空输入不启用内部上拉、下拉外部电路负责提供确定的电平
上拉输入启用上拉没有外部拉低时,默认读取高电平
下拉输入启用下拉没有外部拉高时,默认读取低电平
模拟输入使用模拟通路把电压交给 ADC 等模拟外设
把四种输入方式放在同一张结构图中比较。
把四种输入方式放在同一张结构图中比较。

配置寄存器用不同位组合选择模式。学习时先回答“外部接了什么、空闲时应该是什么状态”,再决定输入方式,比直接记选项更容易。

3 输出:主动驱动或释放引脚​

推挽输出​

推挽输出通过上、下两个驱动器件切换,使引脚能够主动输出高电平,也能够主动输出低电平。课程中的普通点灯控制就可以用这种方式理解。

推挽结构:高电平与低电平均由内部输出级驱动。
推挽结构:高电平与低电平均由内部输出级驱动。

开漏输出​

开漏输出保留下拉能力:导通时把引脚拉低,断开时释放引脚。释放不等于主动输出高电平,高电平通常由外部上拉电阻形成。

开漏结构需要结合外部上拉电路一起分析。
开漏结构需要结合外部上拉电路一起分析。

这种结构允许多个设备共用一条信号线,后面的 IIC 课程会继续使用这个概念。

普通输出与复用输出​

模式谁决定输出时序电气结构
通用推挽GPIO 数据控制推挽
通用开漏GPIO 数据控制开漏
复用推挽定时器、串口等外设推挽
复用开漏IIC 等外设开漏

“复用”改变的是控制来源;推挽或开漏描述的是输出级的电气行为。这两件事应分开理解。

4 程序怎样改变输出​

输出数据寄存器 ODR 保存输出状态。直接修改其中一位时,常会涉及先读、修改、再写的过程。

BSRR 提供单独的置位、复位操作:低 16 位用于置位,对应的高 16 位用于复位。这样可以明确地改变指定引脚,而不必重写其他引脚的状态。

把“置位”和“复位”的位位置,与 GPIO 引脚编号对应起来。
把“置位”和“复位”的位位置,与 GPIO 引脚编号对应起来。